#ifndef _EXP_4_
#define _EXP_4_
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1  // 真/是
#define FALSE 0 // 假/否
typedef int Boolean;
#define OK 1    // 通过/成功
#define ERROR 0 // 错误/失败
#define OVERFLOW 0
#define LIST_INIT_SIZE 21 // 顺序表存储空间的初始分配量
#define LIST_INCREASE 10  // 顺序表存储空间的分配增量
typedef int Status;
typedef int ElemType;
typedef struct TreeNode {
    ElemType val;
    struct TreeNode* lchild, * rchild;
} Node;

typedef struct {
    Node** data; // 顺序表存储空间的基址（指向顺序表所占内存的起始位置）
    int size;    // 当前顺序表长度（包含多少元素）
    int capacity; // 当前分配的存储容量（可以存储多少元素）
} SqList;

typedef struct {
    Node* root;
    SqList list;
    Boolean(*cmp)(Node*, Node*);
} BinTree;

//顺序表操作,该顺序表序号从0开始
Status SqList_init(SqList* L); //初始化顺序表
Status SqList_init_capacity(SqList* L,
    int _capacity); //初始化顺序表，自定义初始容量
Status SqList_destroy(SqList* L);           //销毁顺序表
Status SqList_valid(SqList* L);             //检测顺序表是否有效
Status SqList_clear(SqList* L);             //清空顺序表
Status SqList_empty(SqList* L);             //检测顺序表是否为空
int SqList_size(SqList* L);                 //获取顺序表长度
Status SqList_at(SqList* L, int i, Node** e); //获取序号为i的元素
Status SqList_insert(SqList* L, int index, Node** e); //在序号index的位置插入
Status SqList_pushBack(SqList* L, Node** e); //顺序表末端插入元素
Status SqList_pop(SqList* L, Node** e);      //顺序表末端删除元素
Status SqList_erase(SqList* L, int index);   //删除序号index的元素
void SqList_traverse(SqList* L, void (*visit)(Node**)); //遍历顺序表

//交换两个顶点之间的值
Boolean less(Node* a, Node* b);
Boolean greater(Node* a, Node* b);
void Node_swap(BinTree* tree, int i, int j);
void make_heap(BinTree* tree, ElemType l[], int len,
    Boolean(*cmp)(Node*, Node*));
Status top_heap(BinTree* tree, ElemType* e);
Status head_clear(BinTree* tree);
Status pop_heap(BinTree* tree, ElemType* e);
#endif